package com.wang.aopdemo.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * 切面类 (生成切面对象)
 * @author yandong
 */
@Aspect // 标识当前类为切面类
@Component // 将切面类交给Spring管理 (注入到IOC容器中)
public class LogAspect {
    /**
     * 切入点表达式 (指定要拦截的方法)
     * 通过此方法去和目标方法建立联系
     */
    @Pointcut("@annotation(com.wang.aopdemo.annotation.LogAnnotation)")
    public void logPointCut() {
    }

    /**
     * 环绕通知 (在目标方法执行前后添加逻辑)
     */
    @Around("logPointCut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        // 取方法名
        String name = joinPoint.getSignature().getName();

        // 前置处理
        System.out.println("调用" + name + "方法前");

        // 返回目标方法的返回值
        Object result = joinPoint.proceed();

        // 后置处理
        System.out.println("方法执行结果:" + result);
        System.out.println("调用" + name + "方法后");


        return result;
    }
}
